/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package tp1.controllers;

import com.itextpdf.text.DocumentException;
import java.io.FileNotFoundException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import tp1.Main;
import tp1.dao.ChamadaDao;
import tp1.dao.ClienteDao;
import tp1.dao.LinhaDao;
import tp1.dao.PlanoDao;
import tp1.models.Chamada;
import tp1.models.Cliente;
import tp1.models.Linha;
import tp1.models.Plano;
import tp1.relatorio.ContaTelefonica;
import tp1.views.LinhaPanel;

/**
 *
 * @author tulio
 */
public class LinhaController extends Controller {

    protected static LinhaController instance = null;

    protected LinhaController(JPanel view) {
        super(view);
    }

    public static LinhaController getInstance(int controller, JPanel view){
        if(instance == null) {
            instance = new LinhaController(view);
        }
        return instance;
    }

    @Override
    public void action(int event) {
        switch(event){
            case Controller.EVENTO_ABRIR_TELA_LINHA:
                abrirAction();
                break;
            case Controller.EVENTO_SALVAR_LINHA:
                salvarAction();
                break;
            case Controller.EVENTO_APAGAR_LINHA:
                apagarAction();
                break;
            case Controller.EVENTO_NOVO_LINHA:
                novoAction();
                break;
            case Controller.EVENTO_EDITAR_LINHA:
                editarAction();
                break;
            case Controller.EVENTO_BUSCAR_LINHA:
                buscarAction();
                break;
            case Controller.EVENTO_RELATORIO_LINHA:
                relatorioAction();
                break;
        }
    }

    public void salvarAction(){
        LinhaPanel linhaPanel = (LinhaPanel) this.view;

        String cpf = linhaPanel.getFieldCliente().getText();
        int codigo = Integer.parseInt(linhaPanel.getFieldPlano().getText());
        
        try {
            Cliente cliente = ClienteDao.find(cpf);
            if(cliente == null)
                throw new Exception("Cliente não encontrado.");
            
            Plano plano = PlanoDao.find(codigo);
            if(plano == null)
                throw new Exception("Plano não encontrado.");

            String at = linhaPanel.getFieldAtivacao().getText().toString();
            String canc = linhaPanel.getFieldCancelamento().getText().toString();

            if(at.replace(":", "").replace("-", "").replace(" ", "").isEmpty())
                throw new Exception("Data de ativação é obrigatório.");
            Date ativacao = Main.formataData(at);
            
            Date cancelamento = null;
            if(!canc.replace(":", "").replace("-", "").replace(" ", "").isEmpty())
                cancelamento = Main.formataData(linhaPanel.getFieldCancelamento().getText().toString());

            Linha linha = new Linha(linhaPanel.getFieldNumero().getText());
            linha.setCliente(cliente);
            linha.setPlano(plano);
            linha.setDataDeAtivacao(ativacao);
            linha.setDataDeCancelamento(cancelamento);
            linha.setDiaDePagamento(Integer.parseInt(linhaPanel.getFieldPagamento().getText()));
            
            if(LinhaDao.save(linha) == 1){
                linhaPanel.updateGridData();
                linhaPanel.reloadDefaults();
                JOptionPane.showMessageDialog(linhaPanel, "Registro salvo com sucesso.");
            } else {
                JOptionPane.showMessageDialog(linhaPanel, "Nenhum registro salvo. Número inválido.");
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(linhaPanel, ex.getMessage(), "Erro!", JOptionPane.ERROR_MESSAGE);        
        } catch (Exception e) {
            JOptionPane.showMessageDialog(linhaPanel, e.getMessage(), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
    }

    public void apagarAction(){
        LinhaPanel linhaPanel = (LinhaPanel) this.view;
        try {
            int row = linhaPanel.getGrid().getSelectedRow();
            Object numero = linhaPanel.getGrid().getModel().getValueAt(row, 0);
            if(LinhaDao.delete(numero.toString()) == 1){
                linhaPanel.updateGridData();
                JOptionPane.showMessageDialog(linhaPanel, "Registro apagado com sucesso.");
            } else {
                JOptionPane.showMessageDialog(linhaPanel, "Nenhum registro apagado. Número inválido.");
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(linhaPanel, ex.getMessage(), "Erro!", JOptionPane.ERROR_MESSAGE);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(linhaPanel, ex.getMessage(), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
    }

    public void novoAction(){
        LinhaPanel linhaPanel = (LinhaPanel) this.view;

        linhaPanel.getFieldNumero().setText("");
        linhaPanel.getFieldNumero().setEditable(true);
        linhaPanel.getFieldPlano().setText("");
        linhaPanel.getFieldCliente().setText("");
        linhaPanel.getFieldAtivacao().setText("");
        linhaPanel.getFieldCancelamento().setText("");
        linhaPanel.getFieldPagamento().setText("");

        linhaPanel.getTabs().setSelectedIndex(1);
    }

    public void editarAction(){
        LinhaPanel linhaPanel = (LinhaPanel) this.view;

        if(linhaPanel.getGrid().getSelectedRow() != -1){
            linhaPanel.getTabs().setSelectedIndex(1);
        } else {
            JOptionPane.showMessageDialog(linhaPanel, "Nenhum linha selecionada. Para editar, primeiro selecione uma linha.");
        }
    }

    public void buscarAction(){
        LinhaPanel linhaPanel = (LinhaPanel) this.view;
        String value = JOptionPane.showInputDialog(linhaPanel, "Qual é o número que deseja localizar?", "Busca", JOptionPane.QUESTION_MESSAGE);
        Object[][] data;
        try {
            data = LinhaDao.findAsVector(value);
            linhaPanel.setGridData(data);
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(linhaPanel, ex.getMessage());        
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(linhaPanel, ex.getMessage());
        }
    }

    public void relatorioAction(){
        LinhaPanel linhaPanel = (LinhaPanel) this.view;
        int row = linhaPanel.getGrid().getSelectedRow();
        String numero = linhaPanel.getGrid().getModel().getValueAt(row, 0).toString();
        String mesAno = JOptionPane.showInputDialog(linhaPanel, "Informe um mês e ano (yyyy-MM)?", "Filtro", JOptionPane.QUESTION_MESSAGE);
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.set(Calendar.YEAR, Integer.parseInt(mesAno.substring(0, 4)));
        calendar.set(Calendar.MONTH, Integer.parseInt(mesAno.substring(5, 7)));

        try {
            ArrayList<Chamada> chamadas = ChamadaDao.findByTelefoneEMes(numero, calendar);
            if(chamadas.isEmpty()){
                throw new Exception("Dados de chamadas para este número não foram encontrados.");
            }

            ContaTelefonica r = new ContaTelefonica();
            r.setNome(numero);
            r.setChamadas(chamadas);
            r.setTitulo("Conta telefônica - Linha: " + numero);
            r.criar();
        } catch (DocumentException de) {
            JOptionPane.showMessageDialog(linhaPanel, de.getMessage());
        } catch (FileNotFoundException fe) {
            JOptionPane.showMessageDialog(linhaPanel, fe.getMessage());
        } catch (SQLException se) {
            JOptionPane.showMessageDialog(linhaPanel, se.getMessage());
        } catch (Exception e) {
            JOptionPane.showMessageDialog(linhaPanel, e.getMessage());
        }
    }

}
